﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace ConcordWinManager
{
    /// <summary>
    /// Форма добавления/изменения договора
    /// </summary>
    public partial class ContractEditForm : Form
    {
        /// <summary>
        /// Режим
        /// </summary>
        private string mode;

        /// <summary>
        /// Родительская форма
        /// </summary>
        private Form parentForm;

        /// <summary>
        /// Договор
        /// </summary>
        public Contract contract;

        /// <summary>
        /// Флаг правки
        /// </summary>
        private bool act = false;

        public ContractEditForm()
        {
            InitializeComponent();
            
        }

        /// <summary>
        /// Конструктор на добавление
        /// </summary>
        /// <param name="parentForm"></param>
        /// <param name="mode"></param>
        public ContractEditForm(Form parentForm, string mode)
        {
            InitializeComponent();

            this.mode = mode;

            this.Text = string.Format("Договор [{0}]", mode);

            this.parentForm = parentForm;

            if (this.mode == "Добавление")
            {
                this.contract = new Contract();
                act = true;
            }
        }


        /// <summary>
        /// Конструктор на изменение
        /// </summary>
        /// <param name="parentForm"></param>
        /// <param name="mode"></param>
        /// <param name="id"></param>
        public ContractEditForm(Form parentForm, string mode, int id)
        {
            InitializeComponent();

            this.mode = mode;

            this.Text = string.Format("Договор [{0}]", mode);

            this.parentForm = parentForm;

            if (mode == "Изменение")
            {
                this.contract = new Contract();

                Tools.RunWithProgressIndicator(this, delegate
                {
                    ////А вот не надо изменять договора!

                    //contragent.SelectById(id);

                    //tbxName.Text = rezident.Name;
                    //tbxDetails.Text = rezident.Details;
                    //tbxNote.Text = rezident.Note;

                });
            }

            this.act = true;

          
        }

        private void btnRezidentChange_Click(object sender, EventArgs e)
        {
            RezidentForm rezidentForm = new RezidentForm(this);
            rezidentForm.ShowDialog();

            this.contract.rezident = rezidentForm.rezident;
            tbxRezidentName.Text = rezidentForm.rezident.Name;
        }

        /// <summary>
        /// Генерация параметров договора
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void rebuildContractData(object sender, EventArgs e)
        {
            if (act)
            {
                try
                {
                    Calc();
                    this.contract.Advance = Convert.ToDecimal(tbxAdvance.Text.Trim());
                    this.contract.SummItog = Convert.ToDecimal(tbxSummItog.Text.Trim());
                    this.contract.SummPre = Convert.ToDecimal(tbxSummPre.Text.Trim());
                    this.contract.SkidkaPercent = Convert.ToInt32(nudSkidka.Value);
                    this.contract.SummWork = Convert.ToDecimal(tbxSummWork.Text.Trim());
                    if (comboBox1.SelectedIndex != -1)
                    {
                        this.contract.id_oplata_type = li_id_oplata_type[comboBox1.SelectedIndex];
                    }

                    tbxSummProp.Text = RSDN.RusCurrency.Str(Convert.ToDouble(this.contract.Advance), "RUR");
                }
                catch
                {
                    MessageBox.Show("Входная строка имеет неверный формат", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);                    
                }

            }


            cbxPD4.Visible = (comboBox1.Text.Contains("Рассрочка") || comboBox1.Text.Contains("50%"));
            //cbxPD4.Checked = (comboBox1.Text.Contains("Рассрочка") || comboBox1.Text.Contains("50%"));
          
        }
        
        /// <summary>
        /// Нажатие на кнопку Отмена
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        /// <summary>
        /// Выбор контрагента
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnContragentChange_Click(object sender, EventArgs e)
        {
            ContragentForm contragentForm = new ContragentForm(this);
            contragentForm.ShowDialog();          

            if (contragentForm.contragent.id_contragent != 0)
            {
                contract.contragent = contragentForm.contragent;
                contract.address_postavka = contragentForm.contragent.address;

                rtbxContragentDetails.Text = "";

                switch (contract.contragent.typeContragent)
                {
                    case "ФЛ":
                        tbxContragentName.Text = string.Format("{0} {1} {2}",
                            contract.contragent.Family,
                            contract.contragent.Name,
                            contract.contragent.FName
                            );

                        rtbxContragentDetails.Text = string.Format("Дата рождения: {0} \nПол: {1}\nНомер и серия паспорта: {2} {3} \nКогда и кем выдан: {4}\nАдрес прописки: {5}\n",
                            string.Format("{2}.{1}.{0}",
                                contract.contragent.Birth.Year,
                                contract.contragent.Birth.Month.ToString("0#"),
                                contract.contragent.Birth.Day.ToString("0#")),
                            contract.contragent.Male ? "муж." : "жен.",
                            contract.contragent.PassportSeries,
                            contract.contragent.PassportNumber,
                            contract.contragent.PassportVidan,
                            contract.contragent.address.RebuildAddressText()                            
                            );
                        break;
                    case "ЮЛ":
                        tbxContragentName.Text = string.Format("{0}",
                            contract.contragent.UName
                            );
                        rtbxContragentDetails.Text = string.Format("ИНН/КПП: {0}/{1} \nОГРН: {2} \nБИК: {3} \nр/счет: {4}\nк/счет: {5}\nАдрес: {6}",
                            contract.contragent.INN,
                            contract.contragent.KPP,
                            contract.contragent.OGRN,
                            contract.contragent.BIK,
                            contract.contragent.RSchet,
                            contract.contragent.KSchet,
                            contract.contragent.address.RebuildAddressText()
                            );
                        break;
                    case "ИП":
                        tbxContragentName.Text = string.Format("{0}",
                            contract.contragent.IPName
                            );
                        rtbxContragentDetails.Text = string.Format("ИНН: {0} \nЕГРИП: {1} \nр/счет: {2}\nк/счет: {3}\nАдрес: {4}",
                            contract.contragent.IPINN,
                            contract.contragent.IPEGRIP,
                            contract.contragent.IPRSchet,
                            contract.contragent.IPKSchet,
                            contract.contragent.address.RebuildAddressText()
                            );
                        break;
                    default:
                        break;
                }

                rtbxContragentDetails.Text += string.Format("\n{0}Раб.телефон: {1} \nМоб.телефон: {2} \nE-mail: {3}\n",
                    contract.contragent.typeContragent == "ФЛ" ? "Дом.телефон :" + contract.contragent.telHome + "\n" : "",
                    contract.contragent.telWork,
                    contract.contragent.telMobile,
                    contract.contragent.email
                    );

                if (cbxAddressPostavka.Checked)
                {
                    this.contract.id_address_postavka = this.contract.contragent.id_address;
                    tbxAddressPostavka.Text = contract.contragent.address.RebuildAddressText();
                }
            }
        }

        private bool IsValidForm()
        {
            //if (!(contract.contragent.id_contragent != 0 &&
            //   contract.rezident.id_rezident != 0 &&
            //   contract.template_contract.id_template != 0 &&
            //   contract.template_check.id_template != 0))
            //{
            //    MessageBox.Show("Не все обязательные для заполнения поля заполнены", "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            //    return false;
            //}
            //else 
            if ((comboBox1.Text.Contains("Рассрочка") || comboBox1.Text.Contains("50%")) && contract.template_contract.DocType != "д+р")
            {
                MessageBox.Show("Выберите шаблон договора с соглашением о рассрочке", "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return false;
            }
            else if (!comboBox1.Text.Contains("Рассрочка") && !comboBox1.Text.Contains("50%") && contract.template_contract.DocType == "д+р")                
            {
                MessageBox.Show("Выберите шаблон договора без соглашения о рассрочке", "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return false;
            }
            else
            {                
                return true;
            }
        }
        
        /// <summary>
        /// Нажатие на кнопку ОК
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOK_Click(object sender, EventArgs e)
        {
            bool bSuccessfully = false;

            if (!IsValidForm())
            {
                
                return;
            }

            //Если договор с рассрочкой, то берем кол-во месяцев рассрочки из названия рассрочки            
            if (comboBox1.Text.Contains("Рассрочка"))
            {
                contract.rassrochka = new Rassrochka();

                string[] s = comboBox1.Text.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

                int.TryParse(s[2], out contract.rassrochka.MonthCount);

                contract.rassrochka.PaymentAtMonth = new decimal[contract.rassrochka.MonthCount];
                contract.rassrochka.Months = new DateTime[contract.rassrochka.MonthCount];

                DateTime dt = DateTime.Now;
                //дату первого платежа считать от даты через месяц после аванса
                contract.rassrochka.Months[0] = dt.AddMonths(1);

                for (int i = 0; i < contract.rassrochka.MonthCount; i++)
                {
                    decimal ostatok = decimal.Parse(tbxOstatok.Text);
                    contract.rassrochka.PaymentAtMonth[i] = ostatok / contract.rassrochka.MonthCount;
                }

                for (int i = 1; i < contract.rassrochka.MonthCount; i++)
                {
                    contract.rassrochka.Months[i] = contract.rassrochka.Months[i - 1].AddMonths(1);
                }

            }
            else if (comboBox1.Text.Contains("50%"))//а если 50/50, то это рассрочка на 1 месяц
            {
                contract.rassrochka = new Rassrochka();
                contract.rassrochka.MonthCount = 1;
                contract.rassrochka.PaymentAtMonth = new decimal[contract.rassrochka.MonthCount];
                contract.rassrochka.Months = new DateTime[contract.rassrochka.MonthCount];
                DateTime dt = DateTime.Now;
                contract.rassrochka.Months[0] = dt.AddMonths(1);
                decimal ostatok = decimal.Parse(tbxOstatok.Text);
                contract.rassrochka.PaymentAtMonth[0] = ostatok / contract.rassrochka.MonthCount;
            }

            try
            {
                if (this.mode == "Изменение")
                {
                    Tools.RunWithProgressIndicator(this, delegate { contract.Update(); });
                    //ДОБАВИТЬ ПРОВЕРКУ УСПЕШНОСТИ ВЫПОЛНЕНИЯ ОПЕРАЦИИ
                    MessageBox.Show("Договор изменен успешно", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    if (mode == "Добавление")
                    {
                        Tools.RunWithProgressIndicator(this, delegate { 
                            contract.Insert();                            
                        });
                        //ДОБАВИТЬ ПРОВЕРКУ УСПЕШНОСТИ ВЫПОЛНЕНИЯ ОПЕРАЦИИ
                        MessageBox.Show("Договор добавлен успешно", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        GenerateDocument();
                    }
                }

                bSuccessfully = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ошибка при работе с договором\n\nOriginal message:\n" + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            if (bSuccessfully)
            {
                this.Close();
            }
        }

        public void GenerateDocument()
        {
            List<string> liKeyWordsFrom = new List<string> ();
            List<string> liKeyWordsTo = new List<string> ();

            liKeyWordsFrom.Add("[номер_договора]"); liKeyWordsTo.Add(contract.ContractNumber);
            liKeyWordsFrom.Add("[дд]"); liKeyWordsTo.Add(DateTime.Parse(contract.DateZakl).Day.ToString("0#"));
            liKeyWordsFrom.Add("[мм]"); liKeyWordsTo.Add(DateTime.Parse(contract.DateZakl).Month.ToString("0#"));
            liKeyWordsFrom.Add("[гггг]"); liKeyWordsTo.Add(DateTime.Parse(contract.DateZakl).Year.ToString());
            liKeyWordsFrom.Add("[конт_фамилия]"); liKeyWordsTo.Add(contract.contragent.Family);
            liKeyWordsFrom.Add("[конт_имя]"); liKeyWordsTo.Add(contract.contragent.Name);
            liKeyWordsFrom.Add("[конт_отчество]"); liKeyWordsTo.Add(contract.contragent.FName);
            liKeyWordsFrom.Add("[конт_адрес]"); liKeyWordsTo.Add(contract.contragent.address.RebuildAddressText());
            liKeyWordsFrom.Add("[конт_адрес_прописки]"); liKeyWordsTo.Add(contract.contragent.address.RebuildAddressText()); //[конт_адрес_прописки] = [конт_адрес] c 0.2.18.0
            liKeyWordsFrom.Add("[конт_адрес_поставки]"); liKeyWordsTo.Add(contract.address_postavka.RebuildAddressText()); // Добавлено в 0.2.18.0
            liKeyWordsFrom.Add("[конт_паспорт_серия]"); liKeyWordsTo.Add(contract.contragent.PassportSeries);
            liKeyWordsFrom.Add("[конт_паспорт_номер]"); liKeyWordsTo.Add(contract.contragent.PassportNumber);
            liKeyWordsFrom.Add("[конт_паспорт_выдан]"); liKeyWordsTo.Add(contract.contragent.PassportVidan); //0.2.5.0
            liKeyWordsFrom.Add("[конт_телефон_моб]"); liKeyWordsTo.Add(contract.contragent.telMobile); //0.2.5.0
            liKeyWordsFrom.Add("[сумма_договора]"); liKeyWordsTo.Add(contract.SummItog.ToString("F2", System.Globalization.CultureInfo.InvariantCulture));
            liKeyWordsFrom.Add("[сумма_договора_прописью]"); liKeyWordsTo.Add(RSDN.RusCurrency.Str(Convert.ToDouble(contract.SummItog), "RUR")); //0.2.5.0
            liKeyWordsFrom.Add("[стоимость_работ]"); liKeyWordsTo.Add(contract.SummWork.ToString("F2", System.Globalization.CultureInfo.InvariantCulture));
            liKeyWordsFrom.Add("[стоимость_работ_прописью]"); liKeyWordsTo.Add(RSDN.RusCurrency.Str(Convert.ToDouble(contract.SummWork), "RUR")); //0.2.5.0;
            liKeyWordsFrom.Add("[аванс]"); liKeyWordsTo.Add(contract.Advance.ToString("F2", System.Globalization.CultureInfo.InvariantCulture));
            liKeyWordsFrom.Add("[сумма_оплата_число]"); liKeyWordsTo.Add(contract.Advance.ToString("F2", System.Globalization.CultureInfo.InvariantCulture));
            liKeyWordsFrom.Add("[сумма_оплата_прописью]"); liKeyWordsTo.Add(tbxSummProp.Text);
            liKeyWordsFrom.Add("[конс_фамилия]"); liKeyWordsTo.Add(Settings.consultant.Family);
            liKeyWordsFrom.Add("[конс_имя]"); liKeyWordsTo.Add(Settings.consultant.Name);
            liKeyWordsFrom.Add("[конс_отчество]"); liKeyWordsTo.Add(Settings.consultant.FName);
            liKeyWordsFrom.Add("[конс_фамилия_род]"); liKeyWordsTo.Add(Settings.consultant.Family2);
            liKeyWordsFrom.Add("[конс_имя_род]"); liKeyWordsTo.Add(Settings.consultant.Name2);
            liKeyWordsFrom.Add("[конс_отчество_род]"); liKeyWordsTo.Add(Settings.consultant.FName2);
            liKeyWordsFrom.Add("[номер_доверенности]"); liKeyWordsTo.Add(Settings.consultant.doverennost.Num_doverennost);
            liKeyWordsFrom.Add("[основание_оплаты]"); liKeyWordsTo.Add(string.Format("оплата по договору {0} от {1}",
                                                                                                    contract.ContractNumber,
                                                                                                    string.Format("{0}.{1}.{2}", 
                                                                                                    DateTime.Parse(contract.DateZakl).Day.ToString("0#"), 
                                                                                                    DateTime.Parse(contract.DateZakl).Month.ToString("0#"), 
                                                                                                    DateTime.Parse(contract.DateZakl).Year)));
            liKeyWordsFrom.Add("[резидент_название]"); liKeyWordsTo.Add(contract.rezident.Name2);
            liKeyWordsFrom.Add("[резидент_реквизиты]"); liKeyWordsTo.Add(contract.rezident.Details);
            //Новые реквизиты начиная с версии 0.2.18.0 от 10.10.2011
            liKeyWordsFrom.Add("[резидент_ИНН]"); liKeyWordsTo.Add(contract.rezident.INN);
            liKeyWordsFrom.Add("[резидент_КПП]"); liKeyWordsTo.Add(contract.rezident.KPP);
            liKeyWordsFrom.Add("[резидент_ОГРН]"); liKeyWordsTo.Add(contract.rezident.OGRN);
            liKeyWordsFrom.Add("[резидент_ОГРНИП]"); liKeyWordsTo.Add(contract.rezident.OGRN);
            liKeyWordsFrom.Add("[резидент_номер_счета]"); liKeyWordsTo.Add(contract.rezident.n_account);
            liKeyWordsFrom.Add("[резидент_кор_счет]"); liKeyWordsTo.Add(contract.rezident.kor_account);
            liKeyWordsFrom.Add("[резидент_банк]"); liKeyWordsTo.Add(contract.rezident.bank_name);
            liKeyWordsFrom.Add("[резидент_БИК]"); liKeyWordsTo.Add(contract.rezident.BIK);
            liKeyWordsFrom.Add("[резидент_директор]"); liKeyWordsTo.Add(contract.rezident.director);
            liKeyWordsFrom.Add("[резидент_действ_на_осн]"); liKeyWordsTo.Add(contract.rezident.acting_of_the_basis);
            liKeyWordsFrom.Add("[резидент_юр_адрес]"); liKeyWordsTo.Add(contract.rezident.ur_address);
            liKeyWordsFrom.Add("[резидент_почт_адрес]"); liKeyWordsTo.Add(contract.rezident.post_address);
            liKeyWordsFrom.Add("[резидент_телефон]"); liKeyWordsTo.Add(contract.rezident.tel_number);
            liKeyWordsFrom.Add("[резидент_факс]"); liKeyWordsTo.Add(contract.rezident.fax_number);
            liKeyWordsFrom.Add("[резидент_email]"); liKeyWordsTo.Add(contract.rezident.email);


            string s = string.Empty;  

            if (contract.rassrochka != null)
            {
                s += "Месяц\tСумма для погашения платежа (не менее её), рублей\n";
                for (int j = 0; j < contract.rassrochka.MonthCount; j++)
                {
                    s += string.Format("{0}\t{1} ({2})\n",
                            string.Format("{0}.{1}.{2}",
                                contract.rassrochka.Months[j].Day.ToString("0#"),
                                contract.rassrochka.Months[j].Month.ToString("0#"),
                                contract.rassrochka.Months[j].Year),
                            Math.Round(contract.rassrochka.PaymentAtMonth[j], 2).ToString("F2", System.Globalization.CultureInfo.InvariantCulture),
                            RSDN.RusCurrency.Str(Convert.ToDouble(Math.Round(contract.rassrochka.PaymentAtMonth[j], 2)), "RUR")
                            );
                }                
            }

            liKeyWordsFrom.Add("[таблица_рассрочки]"); liKeyWordsTo.Add(s);

            //liKeyWordsFrom.Add("[_____________________"); liKeyWordsTo.Add("Ы");
            //liKeyWordsFrom.Add(" "); liKeyWordsTo.Add(" ");
            //liKeyWordsFrom.Add(""); liKeyWordsTo.Add("");
            //liKeyWordsFrom.Add(""); liKeyWordsTo.Add("");
            //liKeyWordsFrom.Add(""); liKeyWordsTo.Add("");
            //liKeyWordsFrom.Add(""); liKeyWordsTo.Add("");
            //liKeyWordsFrom.Add(""); liKeyWordsTo.Add("");


            // *************************
            // ПЕРЕДЕЛАТЬ!!!
            DataSet ds = new DataSet();
            string query1 = string.Format("SELECT COUNT(id_oplata) AS [CountOplat] FROM dbo.Oplata WHERE id_contract = {0}",
                contract.id_contract);

            DB.query_table(query1, "dbo.Oplata", ref ds);

            int countOplat = int.Parse(ds.Tables[0].Rows[0]["CountOplat"].ToString());

            string OplataNum = string.Format(@"{0}/{1}",
                this.contract.ContractNumber,
                countOplat);

            liKeyWordsFrom.Add("[номер_квитанции]"); liKeyWordsTo.Add(OplataNum);
            // *************************


            wrd = new Microsoft.Office.Interop.Word.Application();

            Tools.RunWithProgressIndicator(this, delegate
            {
                contract.template_contract.GenerateDocument(contract.rassrochka, liKeyWordsFrom, liKeyWordsTo, ref wrd, contract.ContractNumber);
                contract.template_check.GenerateDocument(null, liKeyWordsFrom, liKeyWordsTo, ref wrd, contract.ContractNumber+"op");

                //Квитанцию ПД-4 ннннаада?
                if (cbxPD4.Checked)
                {
                    DataSet ds4 = new DataSet();
                    contract.template_pd4.SelectPD4("пд4_" + contract.rassrochka.MonthCount, ref ds4);
                    contract.template_pd4.GenerateDocument(null, liKeyWordsFrom, liKeyWordsTo, ref wrd, contract.ContractNumber + "pd4");
                }
            });

        }

        Microsoft.Office.Interop.Word.Application wrd;
        /// <summary>
        /// Список идентификаторов типов оплаты
        /// </summary>
        List<int> li_id_oplata_type;

        /// <summary>
        /// Список расшифровок типов оплаты
        /// </summary>
        List<string> li_oplata_type_definition;

        /// <summary>
        /// Загрузка формы добалвения/изменения договора
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ContractEditForm_Load(object sender, EventArgs e)
        {
            tbxConsultantName.Text = string.Format("{0} {1} {2}",
                Settings.consultant.Family,
                Settings.consultant.Name,
                Settings.consultant.FName);

            this.contract.consultant = Settings.consultant;
                                    
            li_id_oplata_type = new List<int>();
            li_oplata_type_definition = new List<string>();


            Tools.RunWithProgressIndicator(this, delegate
            {
                DataSet ds = new DataSet();
                DB.query_table("SELECT * FROM dbo.Oplata_type", "dbo.Oplata_type", ref ds);

                foreach (DataRow dr in ds.Tables[0].Rows)
                {
                    li_id_oplata_type.Add(int.Parse(dr["id_oplata_type"].ToString()));
                    li_oplata_type_definition.Add(dr["Definition"].ToString());
                }
            });

            comboBox1.Items.AddRange(li_oplata_type_definition.ToArray());

            if (comboBox1.Items.Count > 0)
            {
                comboBox1.SelectedIndex = 0;
            }
        }

        /// <summary>
        /// Расчет параметров
        /// </summary>
        void Calc()
        {
            try
            {
                tbxSummItog.Text = Math.Round(double.Parse(tbxSummPre.Text) - double.Parse(tbxSummPre.Text) * double.Parse(nudSkidka.Value.ToString()) / 100,2).ToString();
                tbxSummWork.Text = Math.Round((double.Parse(tbxSummItog.Text) * 0.06),2).ToString();
                tbxOstatok.Text = Math.Round((double.Parse(tbxSummItog.Text) - double.Parse(tbxAdvance.Text)),2).ToString();

                if (comboBox1.Text.Contains("Рассрочка") || comboBox1.Text.Contains("50%"))
                {
                    tbxAdvance.ReadOnly = false;
                }
                else
                {
                    tbxAdvance.ReadOnly = true; ;

                    tbxAdvance.Text = tbxSummItog.Text;
                }
            }
            catch { ;}
        }

        /// <summary>
        /// Обработка ввода параметров
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tbx_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (
                !char.IsDigit(e.KeyChar) && 
                !char.IsControl(e.KeyChar) && 
                !((e.KeyChar == ',') &&
                !((TextBox)sender).Text.Contains(","))
               )
            {
                e.Handled = true;
            }
        }

        /// <summary>
        /// Выбор шаблона договора
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnTemplateChange_Click(object sender, EventArgs e)
        {
            TemplateForm templateForm;
            if (comboBox1.Text.Contains("Рассрочка") || comboBox1.Text.Contains("50%"))
            {
                templateForm = new TemplateForm(this, "д+р");
            }
            else
            {
                templateForm = new TemplateForm(this, "д");
            }

            templateForm.ShowDialog();

            if (templateForm.template.id_template != 0)
            {
                contract.template_contract = templateForm.template;

                tbxTemplateText.Text = contract.template_contract.Name; 
            }
        }

        /// <summary>
        /// Выбор квитанции об оплате
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCheckChange_Click(object sender, EventArgs e)
        {
            TemplateForm templateForm = new TemplateForm(this, "к");
            templateForm.ShowDialog();

            if (templateForm.template.id_template != 0)
            {
                contract.template_check = templateForm.template;

                tbxCheckText.Text = contract.template_check.Name;
            }
        }


        public void ViewContract(int id_contract)
        {
            Contract contract = new Contract();
            contract.SelectById(id_contract);

            {
                List<string> liKeyWordsFrom = new List<string>();
                List<string> liKeyWordsTo = new List<string>();

                liKeyWordsFrom.Add("[номер_договора]"); liKeyWordsTo.Add(contract.ContractNumber);
                liKeyWordsFrom.Add("[дд]"); liKeyWordsTo.Add(DateTime.Parse(contract.DateZakl).Day.ToString("0#"));
                liKeyWordsFrom.Add("[мм]"); liKeyWordsTo.Add(DateTime.Parse(contract.DateZakl).Month.ToString("0#"));
                liKeyWordsFrom.Add("[гггг]"); liKeyWordsTo.Add(DateTime.Parse(contract.DateZakl).Year.ToString());
                liKeyWordsFrom.Add("[конт_фамилия]"); liKeyWordsTo.Add(contract.contragent.Family);
                liKeyWordsFrom.Add("[конт_имя]"); liKeyWordsTo.Add(contract.contragent.Name);
                liKeyWordsFrom.Add("[конт_отчество]"); liKeyWordsTo.Add(contract.contragent.FName);
                liKeyWordsFrom.Add("[конт_адрес]"); liKeyWordsTo.Add(contract.contragent.address.RebuildAddressText());
                liKeyWordsFrom.Add("[конт_адрес_прописки]"); liKeyWordsTo.Add(contract.contragent.address.RebuildAddressText()); //[конт_адрес_прописки] = [конт_адрес] c 0.2.18.0
                liKeyWordsFrom.Add("[конт_адрес_поставки]"); liKeyWordsTo.Add(contract.address_postavka.RebuildAddressText()); // Добавлено в 0.2.18.0
                liKeyWordsFrom.Add("[конт_паспорт_серия]"); liKeyWordsTo.Add(contract.contragent.PassportSeries);
                liKeyWordsFrom.Add("[конт_паспорт_номер]"); liKeyWordsTo.Add(contract.contragent.PassportNumber);
                liKeyWordsFrom.Add("[конт_паспорт_выдан]"); liKeyWordsTo.Add(contract.contragent.PassportVidan); //0.2.5.0
                liKeyWordsFrom.Add("[конт_телефон_моб]"); liKeyWordsTo.Add(contract.contragent.telMobile); //0.2.5.0
                liKeyWordsFrom.Add("[сумма_договора]"); liKeyWordsTo.Add(contract.SummItog.ToString("F2", System.Globalization.CultureInfo.InvariantCulture));
                liKeyWordsFrom.Add("[сумма_договора_прописью]"); liKeyWordsTo.Add(RSDN.RusCurrency.Str(Convert.ToDouble(contract.SummItog), "RUR")); //0.2.5.0
                liKeyWordsFrom.Add("[стоимость_работ]"); liKeyWordsTo.Add(contract.SummWork.ToString("F2", System.Globalization.CultureInfo.InvariantCulture));
                liKeyWordsFrom.Add("[стоимость_работ_прописью]"); liKeyWordsTo.Add(RSDN.RusCurrency.Str(Convert.ToDouble(contract.SummWork), "RUR")); //0.2.5.0;
                liKeyWordsFrom.Add("[аванс]"); liKeyWordsTo.Add(contract.Advance.ToString("F2", System.Globalization.CultureInfo.InvariantCulture));
                liKeyWordsFrom.Add("[сумма_оплата_число]"); liKeyWordsTo.Add(contract.Advance.ToString("F2", System.Globalization.CultureInfo.InvariantCulture));
                liKeyWordsFrom.Add("[сумма_оплата_прописью]"); liKeyWordsTo.Add(RSDN.RusCurrency.Str(Convert.ToDouble(contract.Advance), "RUR"));//liKeyWordsTo.Add(tbxSummProp.Text);
                liKeyWordsFrom.Add("[конс_фамилия]"); liKeyWordsTo.Add(contract.consultant.Family);
                liKeyWordsFrom.Add("[конс_имя]"); liKeyWordsTo.Add(contract.consultant.Name);
                liKeyWordsFrom.Add("[конс_отчество]"); liKeyWordsTo.Add(contract.consultant.FName);
                liKeyWordsFrom.Add("[конс_фамилия_род]"); liKeyWordsTo.Add(contract.consultant.Family2);
                liKeyWordsFrom.Add("[конс_имя_род]"); liKeyWordsTo.Add(contract.consultant.Name2);
                liKeyWordsFrom.Add("[конс_отчество_род]"); liKeyWordsTo.Add(contract.consultant.FName2);
                liKeyWordsFrom.Add("[номер_доверенности]"); liKeyWordsTo.Add(contract.consultant.doverennost.Num_doverennost);
                liKeyWordsFrom.Add("[основание_оплаты]"); liKeyWordsTo.Add(string.Format("оплата по договору {0} от {1}",
                                                                                                        contract.ContractNumber,
                                                                                                        string.Format("{0}.{1}.{2}",
                                                                                                        DateTime.Parse(contract.DateZakl).Day.ToString("0#"),
                                                                                                        DateTime.Parse(contract.DateZakl).Month.ToString("0#"),
                                                                                                        DateTime.Parse(contract.DateZakl).Year)));
                liKeyWordsFrom.Add("[резидент_название]"); liKeyWordsTo.Add(contract.rezident.Name2);
                liKeyWordsFrom.Add("[резидент_реквизиты]"); liKeyWordsTo.Add(contract.rezident.Details);

                string s = string.Empty;

                if (contract.rassrochka != null)
                {
                    s += "Месяц\tСумма для погашения платежа (не менее её), рублей\n";
                    for (int j = 0; j < contract.rassrochka.MonthCount; j++)
                    {
                        s += string.Format("{0}\t{1} ({2})\n",
                                string.Format("{0}.{1}.{2}",
                                    contract.rassrochka.Months[j].Day.ToString("0#"),
                                    contract.rassrochka.Months[j].Month.ToString("0#"),
                                    contract.rassrochka.Months[j].Year),
                                Math.Round(contract.rassrochka.PaymentAtMonth[j], 2).ToString("F2", System.Globalization.CultureInfo.InvariantCulture),
                                RSDN.RusCurrency.Str(Convert.ToDouble(Math.Round(contract.rassrochka.PaymentAtMonth[j], 2)), "RUR")
                                );
                    }
                }

                liKeyWordsFrom.Add("[таблица_рассрочки]"); liKeyWordsTo.Add(s);

                //liKeyWordsFrom.Add("[_____________________"); liKeyWordsTo.Add("Ы");
                //liKeyWordsFrom.Add(" "); liKeyWordsTo.Add(" ");
                //liKeyWordsFrom.Add(""); liKeyWordsTo.Add("");
                //liKeyWordsFrom.Add(""); liKeyWordsTo.Add("");
                //liKeyWordsFrom.Add(""); liKeyWordsTo.Add("");
                //liKeyWordsFrom.Add(""); liKeyWordsTo.Add("");
                //liKeyWordsFrom.Add(""); liKeyWordsTo.Add("");


                //// *************************
                //// ПЕРЕДЕЛАТЬ!!!
                //DataSet ds = new DataSet();
                //string query1 = string.Format("SELECT COUNT(id_oplata) AS [CountOplat] FROM dbo.Oplata WHERE id_contract = {0}",
                //    contract.id_contract);

                //DB.query_table(query1, "dbo.Oplata", ref ds);

                //int countOplat = int.Parse(ds.Tables[0].Rows[0]["CountOplat"].ToString());

                //string OplataNum = string.Format(@"{0}/{1}",
                //    this.contract.ContractNumber,
                //    countOplat);

                //liKeyWordsFrom.Add("[номер_квитанции]"); liKeyWordsTo.Add(OplataNum);
                //// *************************


                wrd = new Microsoft.Office.Interop.Word.Application();

                Tools.RunWithProgressIndicator(this, delegate
                {
                    contract.template_contract.GenerateDocument(contract.rassrochka, liKeyWordsFrom, liKeyWordsTo, ref wrd, contract.ContractNumber);
                    //contract.template_check.GenerateDocument(null, liKeyWordsFrom, liKeyWordsTo, ref wrd, contract.ContractNumber + "op");
                });

            }
        }

        private void cbxAddressPostavka_CheckedChanged(object sender, EventArgs e)
        {
            if (cbxAddressPostavka.Checked)
            {
                btnAddressPostavkaChange.Enabled = false;
                tbxAddressPostavka.Text = contract.contragent.address.RebuildAddressText();
            }
            else
            {
                btnAddressPostavkaChange.Enabled = true; 
            }
        }

        private void btnAddressPostavkaChange_Click(object sender, EventArgs e)
        {
            AddressEditForm addressEditForm;
            
            addressEditForm = new AddressEditForm(this, "Добавление");
            

            addressEditForm.ShowDialog();

            tbxAddressPostavka.Text = addressEditForm.address.RebuildAddressText();
            contract.address_postavka = addressEditForm.address;
            contract.id_address_postavka = addressEditForm.address.id_address;
        }
    }
}
